package bloque;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class NodoArbol {
	
	private List<String> listaPrefijos;
	private List<Integer> listaPunteros;
	private Integer nivel;
	
	public NodoArbol(){
		listaPunteros = new ArrayList<Integer>();
		listaPrefijos = new ArrayList<String>();		
	}

	public NodoArbol(List<String> listaPrefijos, List<Integer> listaPunteros2,int posicion, int nivel) {
		this.listaPrefijos =listaPrefijos;		
		this.listaPunteros = listaPunteros2;		
		this.nivel = new Integer(nivel);
	}

	public void convertirBytesANodo(byte[] xInput) throws IOException {

		ByteArrayInputStream bytesRegistro = new ByteArrayInputStream(xInput);
		DataInputStream input = new DataInputStream(bytesRegistro);
		
		listaPrefijos = new ArrayList<String>();
		int tamanioListaPrefijos= input.readInt();
		for(int i=0;i<tamanioListaPrefijos;i++) {
			int tamanioPrefijo=input.readInt();
			byte[] bytesPrefijo= new byte[tamanioPrefijo];
			input.read(bytesPrefijo);
			String stringPrefijo=new String(bytesPrefijo);
			listaPrefijos.add(i, stringPrefijo);
		}

		listaPunteros = new ArrayList<Integer>();
		int tamanioListaPunteros= input.readInt();
		for(int i=0;i<tamanioListaPunteros;i++) {
			int puntero=input.readInt();
			listaPunteros.add(i,puntero);
		}			
		
		nivel=input.readInt();

	}
	
	public byte[] convertirNodoABytes() throws IOException {
				
		ByteArrayOutputStream bytesNodo = new ByteArrayOutputStream();
	    DataOutputStream output = new DataOutputStream(bytesNodo);
							
		output.writeInt(listaPrefijos.size());
		for(int i=0; i<listaPrefijos.size();i++) {
			output.writeInt(listaPrefijos.get(i).getBytes().length);
			output.writeBytes(listaPrefijos.get(i));
		}		
		output.writeInt(listaPunteros.size());
		for(int i=0; i<listaPunteros.size();i++)
			output.writeInt(listaPunteros.get(i));			
		output.writeInt(nivel);
		
		return bytesNodo.toByteArray();
		
	}
	
	public List<String> getListaPrefijos() {
		return listaPrefijos;
	}

	public List<Integer> getListaPunteros() {
		return listaPunteros;
	}

	public Integer getNivel() {
		return nivel;
	}

	public void setNivel(Integer nivel) {
		this.nivel = nivel;
	}
	public void agregarPrimero(String pref, Integer punt) {
		this.listaPrefijos.add(0, pref);
		this.listaPunteros.add(0, punt);		
	}

}
